package edu.uoc.tds.pec4.vista;

import edu.uoc.tds.pec4.model.SS1_TipoEvento;
import edu.uoc.tds.pec4.model.SS2_Evento;
import edu.uoc.tds.pec4.model.SS4_Checkin;
import edu.uoc.tds.pec4.model.SS4_Inscripcion;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import edu.uoc.tds.pec4.util.KeyValue;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import edu.uoc.tds.pec4.util.LanguageUtils;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import edu.uoc.tds.pec4.vista.base.JPanelBase;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 * Clase para visualizar la pantalla de informe evento
 * @author Pedro Bauzá Picó
 * @version 1.0
 */
public class SS4_PantallaCheckInEvento extends JPanelBase {

    private SS4_PantallaMenu SS4_PantallaMenu;
    private JLabel jlabel_TipoEvento;
    private JComboBox jcomboBox_TipoEvento;
    private JLabel jlabel_Evento;
    private JComboBox jcomboBox_Evento;
    private JButton jbutton_Buscar;
    private JButton jbutton_CheckIn;
    private JTable tableInformacion;
    private JScrollPane scrollPanelInformacion;
    private JPanel panelCentral;
    private JButton jbutton_Salir;

    public SS4_PantallaCheckInEvento(SS4_PantallaMenu SS4_PantallaMenu) {
        super();
        this.SS4_PantallaMenu = SS4_PantallaMenu;
        iniciarComponentes();
    }

    /*
     * Método para iniciar los componentes que contiene la pantalla
     */
    private void iniciarComponentes() {

        jlabel_TipoEvento = new JLabel(LanguageUtils.getMessage("CheckInEvento.jlabel_TipoEvento.titulo"));
        jlabel_TipoEvento.setBounds(new Rectangle(20, 20, 176, 25));
        jcomboBox_TipoEvento = new JComboBox();
        jcomboBox_TipoEvento.setSelectedItem(jcomboBox_TipoEvento);
        jcomboBox_TipoEvento.setToolTipText(LanguageUtils.getMessage("CheckInEvento.jcomboBox_TipoEvento.ToolTipText"));
        jcomboBox_TipoEvento.setBounds(new Rectangle(110, 20, 220, 25));
        setListTipoEventoToCombo(jcomboBox_TipoEvento);
        jcomboBox_TipoEvento.addItemListener(new java.awt.event.ItemListener() {

            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                refrescarEventos(evt);
            }
        });
        jlabel_Evento = new JLabel(LanguageUtils.getMessage("CheckInEvento.jlabel_Evento.titulo"));
        jlabel_Evento.setBounds(new Rectangle(20, 60, 176, 25));
        jcomboBox_Evento = new JComboBox();
        jcomboBox_Evento.setSelectedItem(jcomboBox_Evento);
        jcomboBox_Evento.setToolTipText(LanguageUtils.getMessage("CheckInEvento.jcomboBox_Evento.ToolTipText"));
        jcomboBox_Evento.setBounds(new Rectangle(110, 60, 400, 25));
        jbutton_Buscar = new JButton();
        jbutton_Buscar.setText(LanguageUtils.getMessage("CheckInEvento.jbutton_Buscar.titulo"));
        jbutton_Buscar.setName("jbutton_Buscar");
        jbutton_Buscar.setBounds(new Rectangle(530, 20, 150, 25));
        jbutton_CheckIn = new JButton();
        jbutton_CheckIn.setText(LanguageUtils.getMessage("CheckInEvento.jbutton_CheckIn.titulo"));
        jbutton_CheckIn.setName("jbutton_Buscar");
        jbutton_CheckIn.setBounds(new Rectangle(530, 60, 150, 25));
        jbutton_Salir = new JButton();
        jbutton_Salir.setText(LanguageUtils.getMessage("CheckInEvento.jbutton_Salir.titulo"));
        jbutton_Salir.setName("jbutton_Salir");
        jbutton_Salir.setBounds(new Rectangle(530, 400, 150, 25));
        scrollPanelInformacion = new JScrollPane(montarTablaInformacion());
        scrollPanelInformacion.setBounds(new Rectangle(5, 110, 680, 240));
        jbutton_Buscar.addActionListener(SS4_PantallaMenu);
        jbutton_CheckIn.addActionListener(SS4_PantallaMenu);
        jbutton_Salir.addActionListener(SS4_PantallaMenu);

        //Cargamos los evento del tipo de evento
        cargaEventos();

        setLayout(new BorderLayout());
        panelCentral = new JPanel();
        panelCentral.setLayout(null);
        panelCentral.add(jlabel_TipoEvento);
        panelCentral.add(jcomboBox_TipoEvento);
        panelCentral.add(jlabel_Evento);
        panelCentral.add(jcomboBox_Evento);
        panelCentral.add(jbutton_Buscar);
        panelCentral.add(jbutton_CheckIn);
        panelCentral.add(jbutton_Salir);
        panelCentral.add(scrollPanelInformacion);
        add(panelCentral, BorderLayout.CENTER);
    }

    /*
     * Metodo para rellenar el despegable de tipo de evento
     */
    private void setListTipoEventoToCombo(JComboBox combo) {
        try {
            List<SS1_TipoEvento> list = this.SS4_PantallaMenu.getRemotoConexion().getListaTipoEvento();
            if (list != null && list.size() > 0) {
                for (SS1_TipoEvento tipoEvento : list) {
                    combo.addItem(new KeyValue(Integer.toString(tipoEvento.getId()), tipoEvento.getTitulo()));
                }
            }
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
        } catch (Exception ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("CheckInEvento.ERR_TipoEvento"));
        }
    }

    private JTable montarTablaInformacion() {
        tableInformacion = new JTable();
        tableInformacion.setBounds(new Rectangle(5, 110, 680, 240));
        tableInformacion.setName("tableInformacion");
        tableInformacion.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        tableInformacion.setModel(new javax.swing.table.DefaultTableModel(
                new Object[][]{
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null},
                    {null, null, null, null, null, null}
                },
                new String[]{
                    LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.Usuario"),
                    LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.Universidad"),
                    LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.Centro"),
                    LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.UsuarioNom"),
                    LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.FechaIncripcion"),
                    LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.Asistencia")}) {

            Class[] types = new Class[]{
                java.lang.Integer.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Boolean.class
            };
            boolean[] canEdit = new boolean[]{
                false, false, false, false, false, true
            };

            public Class getColumnClass(int columnIndex) {
                return types[columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit[columnIndex];
            }
        });

        tableInformacion.getColumnModel().getColumn(0).setMaxWidth(0);
        tableInformacion.getColumnModel().getColumn(0).setMinWidth(0);
        tableInformacion.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);
        tableInformacion.getTableHeader().getColumnModel().getColumn(0).setMinWidth(0);
        tableInformacion.getColumnModel().getColumn(1).setHeaderValue(LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.Universidad"));
        tableInformacion.getColumnModel().getColumn(1).setResizable(false);
        tableInformacion.getColumnModel().getColumn(1).setMinWidth(160);
        tableInformacion.getColumnModel().getColumn(2).setHeaderValue(LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.Centro"));
        tableInformacion.getColumnModel().getColumn(2).setResizable(false);
        tableInformacion.getColumnModel().getColumn(2).setMinWidth(160);
        tableInformacion.getColumnModel().getColumn(3).setHeaderValue(LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.UsuarioNom"));
        tableInformacion.getColumnModel().getColumn(3).setResizable(false);
        tableInformacion.getColumnModel().getColumn(3).setMinWidth(195);
        tableInformacion.getColumnModel().getColumn(4).setHeaderValue(LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.FechaIncripcion"));
        tableInformacion.getColumnModel().getColumn(4).setResizable(false);
        tableInformacion.getColumnModel().getColumn(5).setHeaderValue(LanguageUtils.getMessage("CheckInEvento.tableInformacion.Campo.Asistencia"));
        tableInformacion.getColumnModel().getColumn(5).setResizable(false);
        tableInformacion.getColumnModel().getColumn(5).setMaxWidth(80);
        return tableInformacion;
    }

    /**
     * Acción que se ejecutará al pulsar el botón
     * @param  Nombre del boton que se ha pulsado
     */
    public void componentePulsado(ActionEvent e) {
        if (e.getSource() == jbutton_Buscar) {
            buscarInscritos();
        } else if (e.getSource() == jbutton_CheckIn) {
            guardarAsistencias();
        } else if (e.getSource() == jbutton_Salir) {
            SS4_PantallaMenu.setPanelCentral(new SS4_PanelInicial());
        }
    }

    private void refrescarEventos(java.awt.event.ItemEvent evt) {
        cargaEventos();
    }

    /*
     * Accion que se ejecutara al hacer un cambio de tipo de evento, que refrescara
     * los valores del combo evento
     */
    private void cargaEventos() {
        try {
            //Cogemos el valor del tipo de evento
            String v_TipoEvento = "0";
            KeyValue kv1 = (KeyValue) jcomboBox_TipoEvento.getItemAt(jcomboBox_TipoEvento.getSelectedIndex());
            v_TipoEvento = (String) kv1.getKey();

            List<SS2_Evento> list = this.SS4_PantallaMenu.getRemotoConexion().getListaEvento(v_TipoEvento);
            jcomboBox_Evento.removeAllItems();
            if (list != null && list.size() > 0) {
                for (SS2_Evento evento : list) {
                    jcomboBox_Evento.addItem(new KeyValue(Integer.toString(evento.getidEvento()), evento.getdescripcion()));
                }
            }
            borrarElementosTabla();
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
        } catch (Exception ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("CheckInEvento.ERR_Evento"));
        }
    }

    /*
     * Metodo que realiza la busqueda de las persinas inscritadas a un evento
     */
    private void buscarInscritos() {
        try {
            String validarCondicionesMessage = validarInscripcion();
            if ("".equals(validarCondicionesMessage)) {
                KeyValue kv1 = (KeyValue) jcomboBox_Evento.getItemAt(jcomboBox_Evento.getSelectedIndex());

                List<SS4_Checkin> list = this.SS4_PantallaMenu.getRemotoConexion().getListaCheckIn((String) kv1.getKey());
                borrarElementosTabla();
                //Comprobamos que la consulta nos ha devuelto datos
                if (list.size() > 0) {
                    DefaultTableModel tm = (DefaultTableModel) tableInformacion.getModel();
                    for (int i = 0; i < list.size(); i++) {
                        SS4_Checkin checkin = list.get(i);
                        Object[] rowData = new Object[]{checkin.getId_usuario(), checkin.getUniversidad(), checkin.getCentro(), checkin.getNomUsuario() + " " + checkin.getApe1Usuario() + " " + checkin.getApe2Usuario(), checkin.getFechaInscripcion(), checkin.getCheckin()};
                        tm.insertRow(i, rowData);
                    }
                } else {
                    ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("CheckInEvento.NoDatos"));
                }

            } else {
                ExceptionUtils.visualizarError(validarCondicionesMessage);
            }
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
        } catch (Exception ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("CheckInEvento.ERR_GuardarRegistros"));
        }
    }

    private void borrarElementosTabla() {
        DefaultTableModel tm = (DefaultTableModel) tableInformacion.getModel();
        if (tm != null && tm.getDataVector() != null) {
            tm.getDataVector().removeAllElements();
            tableInformacion.updateUI();
        }
    }

    /*
     * Metodo que comprueba que se han introducido los campos obligatorios y el formato
     */
    private String validarInscripcion() throws RemoteException, Exception {
        //Validar que tiene un evento seleccionado
        KeyValue kv1 = (KeyValue) jcomboBox_Evento.getItemAt(jcomboBox_Evento.getSelectedIndex());
        if (kv1 == null) {
            return LanguageUtils.getMessage("CheckInEvento.Errores.NoHayEvento");
        }
        return "";
    }

    /*
     * Metodo que guardar si los inscritos realmente han asistido al evento
     */
    private void guardarAsistencias() {
        try {
            String validarCondicionesMessage = validarInscripcion();
            if ("".equals(validarCondicionesMessage)) {
                List<SS4_Inscripcion> lista = new ArrayList<SS4_Inscripcion>();
                KeyValue kv1 = (KeyValue) jcomboBox_Evento.getItemAt(jcomboBox_Evento.getSelectedIndex());
                String v_Evento = (String) kv1.getKey();

                //Recorremos la tabla para guardar los cambios del CheckIn
                for (int a = 0; a < tableInformacion.getRowCount(); a++) {
                    String v_Usuario = tableInformacion.getValueAt(a, 0).toString();
                    Boolean v_Checkin = Boolean.parseBoolean(tableInformacion.getValueAt(a, 5).toString());
                    SS4_Inscripcion inscripcion = new SS4_Inscripcion();
                    inscripcion.setId_evento(Integer.parseInt(v_Evento));
                    inscripcion.setId_usuario(Integer.parseInt(v_Usuario));
                    inscripcion.setCheckin(v_Checkin);
                    lista.add(inscripcion);
                }

                //Comprobamos si hay elementos en la lista
                if (!lista.isEmpty()) {
                    if (this.SS4_PantallaMenu.getRemotoConexion().setListaCheckIn(lista)) {
                        ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("CheckInEvento.GuardarCheckIn"));
                    } else {
                        ExceptionUtils.visualizarError(LanguageUtils.getMessage("CheckInEvento.ERR_GuardarCheckIn"));
                    }
                }
            } else {
                ExceptionUtils.visualizarError(validarCondicionesMessage);
            }
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
        } catch (Exception ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("CheckInEvento.ERR_GuardarCheckIn"));
        }

    }
}
